package cn.gyn.gynrpc.core.util;

import lombok.SneakyThrows;

import java.lang.reflect.Field;

public class MockUtils {
    /**
     * 根据类型创建对象返回:基本数据类型、pojo、list等都要处理
     * @param type
     * @return
     */
    public static Object mock(Class type) {
        if (type.equals(Integer.class) || type.equals(Integer.TYPE)) {
            return 1;
        } else if (type.equals(Long.class) || type.equals(Long.TYPE)) {
            return 10000L;
        }
        //检查 type 是否是 Number 类或其子类 Integer\Long\Double\Float\BigDecimal\Byte\Short
        if (Number.class.isAssignableFrom(type)) {
            return 2;
        }
        if (type.equals(String.class)) {
            return "This_is_a_mock_string";
        }
        return mockPojo(type);

    }

    @SneakyThrows
    private static Object mockPojo(Class type) {
        //创建一个type类的构造函数的实体类进行返回
        Object result = type.getDeclaredConstructor().newInstance();
        Field[] fields = type.getDeclaredFields();
        for (Field f : fields) {
            //设为可见:setAccessible(true) 是 Java Bean 中一个私有方法，用于设置一个属性的访问权限为 public，即使属性本身是私有的。
            f.setAccessible(true);
            Class<?> fType = f.getType();
            Object fValue = mock(fType);
            //该方法用于设置指定对象上的指定字段的值
            f.set(result, fValue);
        }
        return result;
    }

    //region 验证mockDto
    public static void main(String[] args) {
        System.out.println(mock(UserDto.class));
        //输出结果1,This_is_a_mock_string  说明方法起作用了
    }

    public static class UserDto {
        private int a;
        private String b;

        @Override
        public String toString() {
            return a + "," + b;
        }
    }
    //endregion
}
